Interactive map of traffic accidents in the metropolitan region of São Paulo, clustered by region and type, during the year 2015.

Thanks for the project Código Urbano for making public access to this data.


Appendix I - Source Code

Made with R and Leaflet, source code:

# load libraries
# install.packages("leaflet")
# install.packages("dplyr")
suppressPackageStartupMessages(library(leaflet))
suppressPackageStartupMessages(library(stringr))
suppressPackageStartupMessages(library(dplyr))

#load and clean
data2015 <- read.csv("./dados/2015/ocorrencias-transito-pmsp-2015.csv")
data2015$lng <- as.numeric(str_match(data2015$WKT, ".*\\((.*)\\s(.*)\\)")[,2])
data2015$lat <- as.numeric(str_match(data2015$WKT, ".*\\((.*)\\s(.*)\\)")[,3])
data2015 <- data2015[complete.cases(data2015[,c("lat","lng")]),]

# add legenda com o TIPO_ACIDE
data2015$TIPO_ACIDE_DESCR[data2015$TIPO_ACIDE=="CO"] <- "Colisão"
data2015$TIPO_ACIDE_DESCR[data2015$TIPO_ACIDE=="CF"] <- "Colisão frontal"
data2015$TIPO_ACIDE_DESCR[data2015$TIPO_ACIDE=="CT"] <- "Colisão traseira"
data2015$TIPO_ACIDE_DESCR[data2015$TIPO_ACIDE=="CL"] <- "Colisão lateral"
data2015$TIPO_ACIDE_DESCR[data2015$TIPO_ACIDE=="CV"] <- "Colisão Transversa"
data2015$TIPO_ACIDE_DESCR[data2015$TIPO_ACIDE=="CP"] <- "Capotamento"
data2015$TIPO_ACIDE_DESCR[data2015$TIPO_ACIDE=="TB"] <- "Tombamento"
data2015$TIPO_ACIDE_DESCR[data2015$TIPO_ACIDE=="AT"] <- "Atropelamento"
data2015$TIPO_ACIDE_DESCR[data2015$TIPO_ACIDE=="AA"] <- "Atropelamento animal"
data2015$TIPO_ACIDE_DESCR[data2015$TIPO_ACIDE=="CH"] <- "Choque"
data2015$TIPO_ACIDE_DESCR[data2015$TIPO_ACIDE=="QM"] <- "Queda moto/bicicleta"
data2015$TIPO_ACIDE_DESCR[data2015$TIPO_ACIDE=="QV"] <- "Queda veículo"
data2015$TIPO_ACIDE_DESCR[data2015$TIPO_ACIDE=="QD"] <- "Queda ocupante dentro"
data2015$TIPO_ACIDE_DESCR[data2015$TIPO_ACIDE=="QF"] <- "Queda ocupante fora"
data2015$TIPO_ACIDE_DESCR[data2015$TIPO_ACIDE=="OU"] <- "Outros"
data2015$TIPO_ACIDE_DESCR[data2015$TIPO_ACIDE=="SI"] <- "Sem informação"

# normaliza numero de vitimas
data2015$VITIMAS_NORM[data2015$VITIMAS < 100] <- data2015[data2015$VITIMAS < 100,17]
data2015$VITIMAS_NORM[data2015$VITIMAS >= 100] <- data2015[data2015$VITIMAS >= 100,17] %/% 100
data2015$VITIMAS_MORTE <- 0
data2015$VITIMAS_MORTE[data2015$VITIMAS >= 100] <- data2015[data2015$VITIMAS >= 100,17] %% 100

# popup
data2015$popup <- paste(data2015$TIPO_ACIDE_DESCR, "<br><br>vitimas feridas:", data2015$VITIMAS_NORM, "<br>vitimas fatais:", data2015$VITIMAS_MORTE, "<br>cod. localização: ", data2015$CADLOGA);

# color
data2015$color[data2015$COD_ACID==2] <- "blue"
data2015$color[data2015$COD_ACID==4] <- "red" 

# top 10 locations
locations <- data2015 %>%
  group_by(WKT) %>%
  summarize(n=n(), vitimas=sum(VITIMAS_NORM), vitimas_morte=sum(VITIMAS_MORTE))

locations$lng <- as.numeric(str_match(locations$WKT, ".*\\((.*)\\s(.*)\\)")[,2])
locations$lat <- as.numeric(str_match(locations$WKT, ".*\\((.*)\\s(.*)\\)")[,3])

locations <- arrange(locations, desc(n))

top10 <- head(locations, 10)

top10$popup <- paste("<b>TOP 10 in number of accidents</b><br><br>total accidents: ", top10$n, "<br>victims: ", top10$vitimas, "<br>deaths: ", top10$vitimas_morte)

locations <- arrange(locations, desc(vitimas_morte))
deadly <- head(locations, 10)
deadly$popup <- paste("<b>Deadly Location</b><br><br>total accidents: ", deadly$n, "<br>victims: ", deadly$vitimas, "<br>deaths: ", deadly$vitimas_morte)

# most run over
run_over <- data2015[data2015$COD_ACID==4,] %>%
  group_by(WKT) %>%
  summarize(n=n(), vitimas=sum(VITIMAS_NORM), vitimas_morte=sum(VITIMAS_MORTE))

run_over$lng <- as.numeric(str_match(run_over$WKT, ".*\\((.*)\\s(.*)\\)")[,2])
run_over$lat <- as.numeric(str_match(run_over$WKT, ".*\\((.*)\\s(.*)\\)")[,3])

run_over <- arrange(run_over, desc(n))
run_over <- head(run_over, 5)
run_over$popup <- paste("<b>Top 5 in run over</b><br><br>total accidents: ", run_over$n, "<br>victims: ", run_over$vitimas, "<br>deaths: ", run_over$vitimas_morte)

# cruza dados dos logradouros
logradouros <- read.csv("./dados/logradouros.csv")
# levels(logradouros$classificacao)
logradouros <- logradouros %>% 
  filter(classificacao == "Transito Rápido", codlog5 != "NULL") %>%
  group_by(codlog5) %>%
  summarize(n=n())
  
run_over_rapido <- data2015 %>%
  filter(COD_ACID==4, CADLOGA %in% logradouros$codlog5)

# factpal <- colorFactor(topo.colors(17), data2015$TIPO_ACIDE, alpha = FALSE, ordered = TRUE)

data2015 %>% leaflet(width=800, height=500, padding=5) %>% addTiles() %>% 
  addCircleMarkers(data = data2015, popup=~popup, clusterOptions = markerClusterOptions(), group="all accidents", color=~color, radius = ~VITIMAS_NORM * 4, weight = 3,  fillOpacity = ~VITIMAS_MORTE + 0.2 ) %>%
  addCircleMarkers(data = run_over_rapido, popup=~popup, group="atropelamentos nas vias expressas", color=~color, radius = 8, weight = 3,  fillOpacity = ~VITIMAS_MORTE + 0.2 ) %>%
  addCircleMarkers(data = data2015[data2015$COD_ACID==4,], popup=~popup, clusterOptions = markerClusterOptions(), group="somente atropelamentos", color=~color, radius = ~VITIMAS_NORM * 4, weight = 3, fillOpacity = ~VITIMAS_MORTE + 0.2 ) %>%
  addMarkers(data=top10, group="worst location", popup=~popup)%>%
  addMarkers(data=deadly, group="deadly", popup=~popup)%>%
  addMarkers(data=run_over, group="somente atropelamentos", popup=~popup)%>%
  addLayersControl(
     baseGroups = c("all accidents", "somente atropelamentos", "atropelamentos nas vias expressas"),
     overlayGroups = c("worst location", "deadly"),
     options = layersControlOptions(collapsed = FALSE),
     position="bottomleft"
  )
LS0tCnRpdGxlOiAiVHJhZmZpYyBBY2NpZGVudHMgaW4gdGhlIE1ldHJvcG9saXRhbiBSZWdpb24gb2YgU8OjbyBQYXVsbyAtIDIwMTUiCmF1dGhvcjogIldhZ25lciBQaW5oZWlybyIKZGF0ZTogIkphbnVhcnksIDIwMTciCm91dHB1dDoKICBodG1sX2RvY3VtZW50OgogICAga2VlcF9tZDogeWVzCiAgICB0aGVtZTogdW5pdGVkCiAgaHRtbF9ub3RlYm9vazoKICAgIGZpZ193aWR0aDogMTYKICAgIHRoZW1lOiB1bml0ZWQKLS0tCgoKSW50ZXJhY3RpdmUgbWFwIG9mIHRyYWZmaWMgYWNjaWRlbnRzIGluIHRoZSBtZXRyb3BvbGl0YW4gcmVnaW9uIG9mIFPDo28gUGF1bG8sIGNsdXN0ZXJlZCBieSByZWdpb24gYW5kIHR5cGUsIGR1cmluZyB0aGUgeWVhciAyMDE1LgoKVGhhbmtzIGZvciB0aGUgcHJvamVjdCBbQ8OzZGlnbyBVcmJhbm9dKGh0dHBzOi8vZ2l0aHViLmNvbS9jb2RpZ291cmJhbm8pIGZvciBtYWtpbmcgcHVibGljIGFjY2VzcyB0byB0aGlzIGRhdGEuCgoKYGBge3IsIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9CnNvdXJjZSgibWFpbi5SIikKcGxvdFRyYWZmaWNBY2NpZGVudHMoKQpgYGAKCgoKCmBgYHtyLCBldmFsPUZBTFNFLCBlY2hvPUZBTFNFfQojIFN1bW1hcnk6CiAgCnN1bWFyaW8gPC0gZGF0YTIwMTUgJT4lCiAgZ3JvdXBfYnkoVElQT19BQ0lERV9ERVNDUikgJT4lCiAgc3VtbWFyaXplKGFjY2lkZW50cz1uKCksIHZpY3RpbXM9c3VtKFZJVElNQVNfTk9STSksIGRlYXRocz1zdW0oVklUSU1BU19NT1JURSkpICU+JQogIGFycmFuZ2UoZGVzYyh2aWN0aW1zKSkKYGBgCgotLS0tCgoKIyMgQXBwZW5kaXggSSAtIFNvdXJjZSBDb2RlCgpNYWRlIHdpdGggW1JdKGh0dHBzOi8vd3d3LnJzdHVkaW8uY29tLykgYW5kIFtMZWFmbGV0XShodHRwczovL3JzdHVkaW8uZ2l0aHViLmlvL2xlYWZsZXQvKSwgc291cmNlIGNvZGU6CgpgYGB7ciwgZXZhbD1GQUxTRX0KIyBsb2FkIGxpYnJhcmllcwojIGluc3RhbGwucGFja2FnZXMoImxlYWZsZXQiKQojIGluc3RhbGwucGFja2FnZXMoImRwbHlyIikKc3VwcHJlc3NQYWNrYWdlU3RhcnR1cE1lc3NhZ2VzKGxpYnJhcnkobGVhZmxldCkpCnN1cHByZXNzUGFja2FnZVN0YXJ0dXBNZXNzYWdlcyhsaWJyYXJ5KHN0cmluZ3IpKQpzdXBwcmVzc1BhY2thZ2VTdGFydHVwTWVzc2FnZXMobGlicmFyeShkcGx5cikpCgojbG9hZCBhbmQgY2xlYW4KZGF0YTIwMTUgPC0gcmVhZC5jc3YoIi4vZGFkb3MvMjAxNS9vY29ycmVuY2lhcy10cmFuc2l0by1wbXNwLTIwMTUuY3N2IikKZGF0YTIwMTUkbG5nIDwtIGFzLm51bWVyaWMoc3RyX21hdGNoKGRhdGEyMDE1JFdLVCwgIi4qXFwoKC4qKVxccyguKilcXCkiKVssMl0pCmRhdGEyMDE1JGxhdCA8LSBhcy5udW1lcmljKHN0cl9tYXRjaChkYXRhMjAxNSRXS1QsICIuKlxcKCguKilcXHMoLiopXFwpIilbLDNdKQpkYXRhMjAxNSA8LSBkYXRhMjAxNVtjb21wbGV0ZS5jYXNlcyhkYXRhMjAxNVssYygibGF0IiwibG5nIildKSxdCgojIGFkZCBsZWdlbmRhIGNvbSBvIFRJUE9fQUNJREUKZGF0YTIwMTUkVElQT19BQ0lERV9ERVNDUltkYXRhMjAxNSRUSVBPX0FDSURFPT0iQ08iXSA8LSAiQ29saXPDo28iCmRhdGEyMDE1JFRJUE9fQUNJREVfREVTQ1JbZGF0YTIwMTUkVElQT19BQ0lERT09IkNGIl0gPC0gIkNvbGlzw6NvIGZyb250YWwiCmRhdGEyMDE1JFRJUE9fQUNJREVfREVTQ1JbZGF0YTIwMTUkVElQT19BQ0lERT09IkNUIl0gPC0gIkNvbGlzw6NvIHRyYXNlaXJhIgpkYXRhMjAxNSRUSVBPX0FDSURFX0RFU0NSW2RhdGEyMDE1JFRJUE9fQUNJREU9PSJDTCJdIDwtICJDb2xpc8OjbyBsYXRlcmFsIgpkYXRhMjAxNSRUSVBPX0FDSURFX0RFU0NSW2RhdGEyMDE1JFRJUE9fQUNJREU9PSJDViJdIDwtICJDb2xpc8OjbyBUcmFuc3ZlcnNhIgpkYXRhMjAxNSRUSVBPX0FDSURFX0RFU0NSW2RhdGEyMDE1JFRJUE9fQUNJREU9PSJDUCJdIDwtICJDYXBvdGFtZW50byIKZGF0YTIwMTUkVElQT19BQ0lERV9ERVNDUltkYXRhMjAxNSRUSVBPX0FDSURFPT0iVEIiXSA8LSAiVG9tYmFtZW50byIKZGF0YTIwMTUkVElQT19BQ0lERV9ERVNDUltkYXRhMjAxNSRUSVBPX0FDSURFPT0iQVQiXSA8LSAiQXRyb3BlbGFtZW50byIKZGF0YTIwMTUkVElQT19BQ0lERV9ERVNDUltkYXRhMjAxNSRUSVBPX0FDSURFPT0iQUEiXSA8LSAiQXRyb3BlbGFtZW50byBhbmltYWwiCmRhdGEyMDE1JFRJUE9fQUNJREVfREVTQ1JbZGF0YTIwMTUkVElQT19BQ0lERT09IkNIIl0gPC0gIkNob3F1ZSIKZGF0YTIwMTUkVElQT19BQ0lERV9ERVNDUltkYXRhMjAxNSRUSVBPX0FDSURFPT0iUU0iXSA8LSAiUXVlZGEgbW90by9iaWNpY2xldGEiCmRhdGEyMDE1JFRJUE9fQUNJREVfREVTQ1JbZGF0YTIwMTUkVElQT19BQ0lERT09IlFWIl0gPC0gIlF1ZWRhIHZlw61jdWxvIgpkYXRhMjAxNSRUSVBPX0FDSURFX0RFU0NSW2RhdGEyMDE1JFRJUE9fQUNJREU9PSJRRCJdIDwtICJRdWVkYSBvY3VwYW50ZSBkZW50cm8iCmRhdGEyMDE1JFRJUE9fQUNJREVfREVTQ1JbZGF0YTIwMTUkVElQT19BQ0lERT09IlFGIl0gPC0gIlF1ZWRhIG9jdXBhbnRlIGZvcmEiCmRhdGEyMDE1JFRJUE9fQUNJREVfREVTQ1JbZGF0YTIwMTUkVElQT19BQ0lERT09Ik9VIl0gPC0gIk91dHJvcyIKZGF0YTIwMTUkVElQT19BQ0lERV9ERVNDUltkYXRhMjAxNSRUSVBPX0FDSURFPT0iU0kiXSA8LSAiU2VtIGluZm9ybWHDp8OjbyIKCiMgbm9ybWFsaXphIG51bWVybyBkZSB2aXRpbWFzCmRhdGEyMDE1JFZJVElNQVNfTk9STVtkYXRhMjAxNSRWSVRJTUFTIDwgMTAwXSA8LSBkYXRhMjAxNVtkYXRhMjAxNSRWSVRJTUFTIDwgMTAwLDE3XQpkYXRhMjAxNSRWSVRJTUFTX05PUk1bZGF0YTIwMTUkVklUSU1BUyA+PSAxMDBdIDwtIGRhdGEyMDE1W2RhdGEyMDE1JFZJVElNQVMgPj0gMTAwLDE3XSAlLyUgMTAwCmRhdGEyMDE1JFZJVElNQVNfTU9SVEUgPC0gMApkYXRhMjAxNSRWSVRJTUFTX01PUlRFW2RhdGEyMDE1JFZJVElNQVMgPj0gMTAwXSA8LSBkYXRhMjAxNVtkYXRhMjAxNSRWSVRJTUFTID49IDEwMCwxN10gJSUgMTAwCgojIHBvcHVwCmRhdGEyMDE1JHBvcHVwIDwtIHBhc3RlKGRhdGEyMDE1JFRJUE9fQUNJREVfREVTQ1IsICI8YnI+PGJyPnZpdGltYXMgZmVyaWRhczoiLCBkYXRhMjAxNSRWSVRJTUFTX05PUk0sICI8YnI+dml0aW1hcyBmYXRhaXM6IiwgZGF0YTIwMTUkVklUSU1BU19NT1JURSwgIjxicj5jb2QuIGxvY2FsaXphw6fDo286ICIsIGRhdGEyMDE1JENBRExPR0EpOwoKIyBjb2xvcgpkYXRhMjAxNSRjb2xvcltkYXRhMjAxNSRDT0RfQUNJRD09Ml0gPC0gImJsdWUiCmRhdGEyMDE1JGNvbG9yW2RhdGEyMDE1JENPRF9BQ0lEPT00XSA8LSAicmVkIiAKCiMgdG9wIDEwIGxvY2F0aW9ucwpsb2NhdGlvbnMgPC0gZGF0YTIwMTUgJT4lCiAgZ3JvdXBfYnkoV0tUKSAlPiUKICBzdW1tYXJpemUobj1uKCksIHZpdGltYXM9c3VtKFZJVElNQVNfTk9STSksIHZpdGltYXNfbW9ydGU9c3VtKFZJVElNQVNfTU9SVEUpKQoKbG9jYXRpb25zJGxuZyA8LSBhcy5udW1lcmljKHN0cl9tYXRjaChsb2NhdGlvbnMkV0tULCAiLipcXCgoLiopXFxzKC4qKVxcKSIpWywyXSkKbG9jYXRpb25zJGxhdCA8LSBhcy5udW1lcmljKHN0cl9tYXRjaChsb2NhdGlvbnMkV0tULCAiLipcXCgoLiopXFxzKC4qKVxcKSIpWywzXSkKCmxvY2F0aW9ucyA8LSBhcnJhbmdlKGxvY2F0aW9ucywgZGVzYyhuKSkKCnRvcDEwIDwtIGhlYWQobG9jYXRpb25zLCAxMCkKCnRvcDEwJHBvcHVwIDwtIHBhc3RlKCI8Yj5UT1AgMTAgaW4gbnVtYmVyIG9mIGFjY2lkZW50czwvYj48YnI+PGJyPnRvdGFsIGFjY2lkZW50czogIiwgdG9wMTAkbiwgIjxicj52aWN0aW1zOiAiLCB0b3AxMCR2aXRpbWFzLCAiPGJyPmRlYXRoczogIiwgdG9wMTAkdml0aW1hc19tb3J0ZSkKCmxvY2F0aW9ucyA8LSBhcnJhbmdlKGxvY2F0aW9ucywgZGVzYyh2aXRpbWFzX21vcnRlKSkKZGVhZGx5IDwtIGhlYWQobG9jYXRpb25zLCAxMCkKZGVhZGx5JHBvcHVwIDwtIHBhc3RlKCI8Yj5EZWFkbHkgTG9jYXRpb248L2I+PGJyPjxicj50b3RhbCBhY2NpZGVudHM6ICIsIGRlYWRseSRuLCAiPGJyPnZpY3RpbXM6ICIsIGRlYWRseSR2aXRpbWFzLCAiPGJyPmRlYXRoczogIiwgZGVhZGx5JHZpdGltYXNfbW9ydGUpCgojIG1vc3QgcnVuIG92ZXIKcnVuX292ZXIgPC0gZGF0YTIwMTVbZGF0YTIwMTUkQ09EX0FDSUQ9PTQsXSAlPiUKICBncm91cF9ieShXS1QpICU+JQogIHN1bW1hcml6ZShuPW4oKSwgdml0aW1hcz1zdW0oVklUSU1BU19OT1JNKSwgdml0aW1hc19tb3J0ZT1zdW0oVklUSU1BU19NT1JURSkpCgpydW5fb3ZlciRsbmcgPC0gYXMubnVtZXJpYyhzdHJfbWF0Y2gocnVuX292ZXIkV0tULCAiLipcXCgoLiopXFxzKC4qKVxcKSIpWywyXSkKcnVuX292ZXIkbGF0IDwtIGFzLm51bWVyaWMoc3RyX21hdGNoKHJ1bl9vdmVyJFdLVCwgIi4qXFwoKC4qKVxccyguKilcXCkiKVssM10pCgpydW5fb3ZlciA8LSBhcnJhbmdlKHJ1bl9vdmVyLCBkZXNjKG4pKQpydW5fb3ZlciA8LSBoZWFkKHJ1bl9vdmVyLCA1KQpydW5fb3ZlciRwb3B1cCA8LSBwYXN0ZSgiPGI+VG9wIDUgaW4gcnVuIG92ZXI8L2I+PGJyPjxicj50b3RhbCBhY2NpZGVudHM6ICIsIHJ1bl9vdmVyJG4sICI8YnI+dmljdGltczogIiwgcnVuX292ZXIkdml0aW1hcywgIjxicj5kZWF0aHM6ICIsIHJ1bl9vdmVyJHZpdGltYXNfbW9ydGUpCgojIGNydXphIGRhZG9zIGRvcyBsb2dyYWRvdXJvcwpsb2dyYWRvdXJvcyA8LSByZWFkLmNzdigiLi9kYWRvcy9sb2dyYWRvdXJvcy5jc3YiKQojIGxldmVscyhsb2dyYWRvdXJvcyRjbGFzc2lmaWNhY2FvKQpsb2dyYWRvdXJvcyA8LSBsb2dyYWRvdXJvcyAlPiUgCiAgZmlsdGVyKGNsYXNzaWZpY2FjYW8gPT0gIlRyYW5zaXRvIFLDoXBpZG8iLCBjb2Rsb2c1ICE9ICJOVUxMIikgJT4lCiAgZ3JvdXBfYnkoY29kbG9nNSkgJT4lCiAgc3VtbWFyaXplKG49bigpKQogIApydW5fb3Zlcl9yYXBpZG8gPC0gZGF0YTIwMTUgJT4lCiAgZmlsdGVyKENPRF9BQ0lEPT00LCBDQURMT0dBICVpbiUgbG9ncmFkb3Vyb3MkY29kbG9nNSkKCiMgZmFjdHBhbCA8LSBjb2xvckZhY3Rvcih0b3BvLmNvbG9ycygxNyksIGRhdGEyMDE1JFRJUE9fQUNJREUsIGFscGhhID0gRkFMU0UsIG9yZGVyZWQgPSBUUlVFKQoKZGF0YTIwMTUgJT4lIGxlYWZsZXQod2lkdGg9ODAwLCBoZWlnaHQ9NTAwLCBwYWRkaW5nPTUpICU+JSBhZGRUaWxlcygpICU+JSAKICBhZGRDaXJjbGVNYXJrZXJzKGRhdGEgPSBkYXRhMjAxNSwgcG9wdXA9fnBvcHVwLCBjbHVzdGVyT3B0aW9ucyA9IG1hcmtlckNsdXN0ZXJPcHRpb25zKCksIGdyb3VwPSJhbGwgYWNjaWRlbnRzIiwgY29sb3I9fmNvbG9yLCByYWRpdXMgPSB+VklUSU1BU19OT1JNICogNCwgd2VpZ2h0ID0gMywgIGZpbGxPcGFjaXR5ID0gflZJVElNQVNfTU9SVEUgKyAwLjIgKSAlPiUKICBhZGRDaXJjbGVNYXJrZXJzKGRhdGEgPSBydW5fb3Zlcl9yYXBpZG8sIHBvcHVwPX5wb3B1cCwgZ3JvdXA9ImF0cm9wZWxhbWVudG9zIG5hcyB2aWFzIGV4cHJlc3NhcyIsIGNvbG9yPX5jb2xvciwgcmFkaXVzID0gOCwgd2VpZ2h0ID0gMywgIGZpbGxPcGFjaXR5ID0gflZJVElNQVNfTU9SVEUgKyAwLjIgKSAlPiUKICBhZGRDaXJjbGVNYXJrZXJzKGRhdGEgPSBkYXRhMjAxNVtkYXRhMjAxNSRDT0RfQUNJRD09NCxdLCBwb3B1cD1+cG9wdXAsIGNsdXN0ZXJPcHRpb25zID0gbWFya2VyQ2x1c3Rlck9wdGlvbnMoKSwgZ3JvdXA9InNvbWVudGUgYXRyb3BlbGFtZW50b3MiLCBjb2xvcj1+Y29sb3IsIHJhZGl1cyA9IH5WSVRJTUFTX05PUk0gKiA0LCB3ZWlnaHQgPSAzLCBmaWxsT3BhY2l0eSA9IH5WSVRJTUFTX01PUlRFICsgMC4yICkgJT4lCiAgYWRkTWFya2VycyhkYXRhPXRvcDEwLCBncm91cD0id29yc3QgbG9jYXRpb24iLCBwb3B1cD1+cG9wdXApJT4lCiAgYWRkTWFya2VycyhkYXRhPWRlYWRseSwgZ3JvdXA9ImRlYWRseSIsIHBvcHVwPX5wb3B1cCklPiUKICBhZGRNYXJrZXJzKGRhdGE9cnVuX292ZXIsIGdyb3VwPSJzb21lbnRlIGF0cm9wZWxhbWVudG9zIiwgcG9wdXA9fnBvcHVwKSU+JQogIGFkZExheWVyc0NvbnRyb2woCiAgICAgYmFzZUdyb3VwcyA9IGMoImFsbCBhY2NpZGVudHMiLCAic29tZW50ZSBhdHJvcGVsYW1lbnRvcyIsICJhdHJvcGVsYW1lbnRvcyBuYXMgdmlhcyBleHByZXNzYXMiKSwKICAgICBvdmVybGF5R3JvdXBzID0gYygid29yc3QgbG9jYXRpb24iLCAiZGVhZGx5IiksCiAgICAgb3B0aW9ucyA9IGxheWVyc0NvbnRyb2xPcHRpb25zKGNvbGxhcHNlZCA9IEZBTFNFKSwKICAgICBwb3NpdGlvbj0iYm90dG9tbGVmdCIKICApCmBgYA==